package com.gitee.cashzhang27.test.boot.other.util;

import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;
import org.apache.commons.io.FileUtils;

/**
 * @author cash Zhang
 * @since 2018/12/10 16:59
 */
public class FreemarkerUtils {

  private static final String SUFFIX = ".html";

  /**
   * 输出HTML文件
   *
   * @param templateFolderPath 模板地址
   * @param templateName 模板文件名
   * @param destHtmlFilePath HTML地址
   * @param destHtmlFileName HTML文件名
   * @param root 数据
   */
  public static String f2html(String templateFolderPath, String templateName,
      String destHtmlFilePath, String destHtmlFileName, Map<String, Object> root)
      throws IOException, TemplateException {
    String pathname = destHtmlFilePath + File.separator + destHtmlFileName + SUFFIX;

    // 通过Freemaker的Configuration读取相应的ftl
    Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);
    // 设定去哪里读取相应的ftl模板文件（绝对路径）
    cfg.setDirectoryForTemplateLoading(new File(templateFolderPath));
    // 设置默认字体
    cfg.setDefaultEncoding("utf-8");
    // 在模板文件目录中找到名称为name的文件
    Template template = cfg.getTemplate(templateName + SUFFIX);

    // 通过一个文件输出流，就可以写到相应的文件中，此处用的是绝对路径
    File file = new File(pathname);
    FileWriter out = new FileWriter(file);
    // 模板输出静态文件
    template.process(root, out);
    out.close();
    return file.getPath();
  }

  /**
   * 把模板读入到String中，然后根据String构造FreeMarker模板
   *
   * @param templateFolderPath 模板地址
   * @param templateName 模板文件名
   * @param destHtmlFilePath HTML地址
   * @param destHtmlFileName HTML文件名
   * @param root 数据
   * @return pathname
   */
  public static String str2Html(String templateFolderPath, String templateName,
      String destHtmlFilePath, String destHtmlFileName, Map<String, Object> root) {
    FileWriter out = null;
    String srcPathname = templateFolderPath + templateName + SUFFIX;
    String destPathname = destHtmlFilePath + destHtmlFileName + SUFFIX;
    try {
      //模板文件
      File file = new File(srcPathname);
      String content = FileUtils.readFileToString(file);
      //构造Configuration
      Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);
      //构造StringTemplateLoader
      StringTemplateLoader loader = new StringTemplateLoader();
      //添加String模板
      loader.putTemplate(templateName, content);
      //把StringTemplateLoader添加到Configuration中
      configuration.setTemplateLoader(loader);
      //获取模板
      Template template = configuration.getTemplate(templateName);
      //构造输出路
      out = new FileWriter(destPathname);
      //生成HTML
      template.process(root, out);
    } catch (IOException | TemplateException e) {
      e.printStackTrace();
    } finally {
      if (null != out) {
        try {
          out.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
    return destPathname;
  }
}
